模拟内容
设计一个内存工作区,并使用下述算法来模拟实现页面的置换:
1、最佳页面置换算法(OPT)
2、先进先出页面置换算法(FIFO)
3、最近最久未使用页面置换算法(LRU)
模拟出对于一个进程的各个页面访问过程中,内存工作区的存储情况(包括页面的调入和调出情况),并记录缺页情况,最后计算显示缺页率。
模拟思路
1、通过随机数(也可以是固定的页面引用序列)产生一个指定范围内的页面号引用串(页号的最大值可以是动态的,如7;页面号引用串的数目也可以是动态,如20),如
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1。
2、给定为进程分配的物理块数,如3块。
3、在进程运行过程中,若其要访问的页面不在内存中,则需要把它调入内存,当内存没有空间时,为保证进程能正常工作,系统必须从内存中调出一页程序或数据送到磁盘的对换区中。
4、采用最佳页面置换算法(OPT)模拟出对于一个进程的各个页面访问过程中,内存工作区的存储情况(包括页面的调入和调出情况),并记录缺页情况,最后计算显示缺页率。
5、采用先进先出页面置换算法(FIFO)模拟出对于一个进程的各个页面访问过程中,内存工作区的存储情况(包括页面的调入和调出情况),并记录缺页情况,最后计算显示缺页率。
6、采用最近最久未使用页面置换算法(LRU)模拟出对于一个进程的各个页面访问过程中,内存工作区的存储情况(包括页面的调入和调出情况),并记录缺页情况,最后计算显示缺页率。
实现方法
编程实现
老规矩,先初始化一些全局变量,包括固定页面引用序列(注:此处也可以随机产生序列),三个物理块对应的数组,统计缺页次数的变量初始次数为3(初始的三个物理块为空),线程,用户输入的时间片长度等。
public static int[] arr = {
7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1 };
public static int[] arr1 = new int[3];//物理块内存
public static int h = 3;//缺页次数
Thread t1;
int time;//时间片长度
初始化arr1数组,将序列的前三个页面转载进内存块,调用load函数修改指定物理块的颜色并维持用户指定时间片长度的时间并将对应的装载信息写入到textbox中。
public void updatearr1() {
for (int i = 0; i < 3; i++) {
arr1[i] = arr[i];
this.tbdanqian.Text = arr[i].ToString();
load(i);
}
}
然后编写一些函数以简化页面置换算法的代码。
load函数:将前三个页面装载入内存,修改对应的内存块的颜色维持一定的时间后再恢复原来的颜色并把页面装载信息加载到textbox中。
public void load(int i) {
if (i == 0)
{
Thread.Sleep(time);
this.tb0.Text = arr1[i].ToString();
this.tb0.BackColor = Color.Yellow;
Thread.Sleep(time);
this.tb0.BackColor = Color.White;
this.tbnews.AppendText("页块" + i + " # 被装载\r\n");
}
else if (i == 1)
{
Thread.Sleep(time);
this.tb1.Text = arr1[i].ToString();
this.tb1.BackColor = Color.Yellow;
Thread.Sleep(time);
this.tb1.BackColor = Color.White;
this.tbnews.AppendText("页块" + i + " # 被装载\r\n");
}
else
{
Thread.Sleep(time);
this.tb2.Text = arr1[i].ToString();
this.tb2.BackColor = Color.Yellow;
Thread.Sleep(time);
this.tb2.BackColor = Color.White;
this.tbnews.AppendText("页块" + i + " # 被装载\r\n");
}
}
函数功能: 判断当前页是否缺页
public static bool isCh